#ifndef TIMETREEWIDGET_H
#define TIMETREEWIDGET_H

#include <QWidget>
#include <QDialog>
#include <QList>
#include <QMap>

class QMenu;

class TimeTreeItemManager;
class TimeTreeWidgetHeader;

/**
 * @brief The TimeTreeWidget class
 * @note 时间TreeWidget
 */
class TimeTreeWidget : public QWidget
{
    Q_OBJECT
public:
     explicit TimeTreeWidget(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
    ~TimeTreeWidget();

public slots:
    /** 响应右键菜单 */
    void slotRightButtonRelease(QPoint pos);

protected:
    /** 设置时间的属性 */
    void setTimeProperty(QString cmd);

protected:
    QMenu *_setTimeMenu;                   // 时间设置菜单
    TimeTreeWidgetHeader* _pTimeHeader;    // 时间刻度尺
    TimeTreeItemManager *_pTimeTreeWidget; // 树状结构管理
};

namespace Ui {
    class TimeSetPropertyDialog;
}

/**
 * @brief The TimeSetPropertyDialog class
 * @note 时间设置属性对话框
 */
class TimeSetPropertyDialog : public QDialog
{
    Q_OBJECT
public:
    explicit TimeSetPropertyDialog(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
    ~TimeSetPropertyDialog();

    Ui::TimeSetPropertyDialog *ui;
};

class TimeTreeWidgetItem;
class QSpacerItem;

/**
 * @brief The TimeTreeItemManager class
 * @note 时间元素管理
 */
class TimeTreeItemManager : public QWidget
{
    Q_OBJECT
public:
    explicit TimeTreeItemManager(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
    ~TimeTreeItemManager();

    void init();

signals:
    /** 刻度尺显示位置信号 */
    void signalSetDialXPos(int xPos);

    /** 刻度尺开始位置增量信号, 刻度尺的开始显示位置由鼠标中键wheel控制 */
    void signalAddWheelValue(int wheelDelta);

    /** 分组元素上下移动增量 */
    void signalWheelEventDelta(int delta);

public slots:
    /** 设置刻度尺显示的位置 */
    void slotSetDialXPos(int xPos);

    /** 设置刻度尺开始位置增量 */
    void slotAddWheelValue(int wheelDelta);

    /** 单击选中其中某一分支 */
    void slotClickedSelected(int);

    /** 双击某一分支，子分支隐藏 */
    void slotDoubleClickedSelected();

    /** 上下移动分级元素 */
    void slotWheelEventDelta(int delta);

protected:
    // Event handlers 捕获鼠标操作
    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *);
    virtual void mouseDoubleClickEvent(QMouseEvent *event);
    virtual void mouseMoveEvent(QMouseEvent *event);
#ifndef QT_NO_WHEELEVENT
    virtual void wheelEvent(QWheelEvent *event);
#endif
    virtual void paintEvent(QPaintEvent *event);
    virtual void resizeEvent(QResizeEvent *);

    /** 将pSelected置为选中状态，其它置为非选中状态 */
    void selectOneItem(TimeTreeWidgetItem* pSelected);

    /** 更新当前显示的元素 */
    void updateShowItem();

protected:
    bool     _isDragging;             // 是否在拖拽
    typedef QList<TimeTreeWidgetItem*> QListTreeItem;
    QMap<int, TimeTreeWidgetItem*> _mapNumToFirstItem; // 记录第一级分支的顺序
    QMap<TimeTreeWidgetItem*, QListTreeItem> _mapFirstToSecondItem;
    QList<TimeTreeWidgetItem*> _listShowItems;   // 记录当前显示的所有Item,用来展现滚动操作
    QSpacerItem* _pSpaceHeader; // 顶部间距
    QSpacerItem* _pSpaceEnd;    // 底部间距

    int _iItemCurWheelValue;    // 鼠标滚动改变开始位置
    int _iItemMinWheelValue;    // 鼠标滚动最小值
    int _iItemMaxWheelValue;    // 鼠标滚动最大值

public:
    static int      s_iCurWheelValue; // 鼠标滚动改变开始位置
    static double   s_dCurDialValue;  // 当前刻度值
    static int      s_iMinDialValue;  // 刻度最小值
    static int      s_iMaxDialValue;  // 刻度最大值
    static int      s_iDialGap;       // 刻度线间距
    static QRect    s_leftRect;      // 左边矩形框
    static int      s_iTextSide;     // 显示文字与开始位置的间距
    static int      s_iTriangle;     // 三角形的边长
    static int      s_iWhiteCircle;  // 白色圆直径
};

#endif // TIMETREEWIDGET_H
